/**
在TypeScript中，严格字面量赋值检测是一种类型检查机制，用于确保变量的赋值与其类型定义严格匹配。这种机制可以帮助开发者捕获潜在的错误，提高代码的类型安全性。
  1. 字面量类型
  - 字面量类型是指具体的值类型，例如字符串字面量、数字字面量、布尔字面量等。
  - TypeScript允许将变量的类型限制为特定的字面量值，从而实现更精确的类型控制。

  2. 严格字面量赋值检测的启用
  - 要启用严格字面量赋值检测，需要在  `tsconfig.json`  文件中设置  `strict`  选项为  `true` ，或者单独设置  `exactOptionalPropertyTypes`  选项。
  - 例如：
  {
    "compilerOptions": {
      "strict": true
    }
  }
  3. 严格赋值检查的行为
  - 当启用严格字面量赋值检测后，TypeScript会检查变量的赋值是否与其字面量类型完全匹配。
  - 例如：
  type Direction = "left" | "right";

  let dir: Direction;
  dir = "left";  // 合法
  dir = "right"; // 合法
  dir = "up";    // 错误：类型“"up"”不可以赋值给类型“Direction”
  4. 可选属性的严格检查
  - 对于可选属性，严格字面量赋值检测会确保在赋值时，未赋值的可选属性不会被推断为  `undefined` 。
  - 例如：
  interface Config {
      optionA?: "enabled" | "disabled";
  }

  const config: Config = {};
  config.optionA = "enabled"; // 合法
  config.optionA = "off";     // 错误：类型“"off"”不可以赋值给类型“"enabled" | "disabled"”
  5. 使用场景
  - 严格字面量赋值检测适用于需要严格控制类型的场景，例如状态机、配置选项等，确保只有预定义的值可以被赋值，从而减少运行时错误。

  6. 总结
  严格字面量赋值检测是TypeScript中的一项重要特性，通过限制变量的赋值为特定的字面量类型，增强了代码的类型安全性。启用此特性后，开发者可以更早地发现潜在的错误，提高代码的可靠性和可维护性。
 */
interface IPerson {
  name: string
  age: number
}

// 1.奇怪的现象一: 
// 定义info, 类型是IPerson类型
const obj = {
  name: "Literal-name",
  age: 18,
  // 多了一个height属性
  height: 1.88
}
const info: IPerson = obj

// 2.奇怪的现象二:
function printPerson(person: IPerson) {}
printPerson(obj)

// 解释现象
// 第一次创建的对象字面量, 称之为fresh(新鲜的)
// 对于新鲜的字面量, 会进行严格的类型检测. 必须完全满足类型的要求(不能有多余的属性), 否则会报错
const info2: IPerson = obj
printPerson(info2)

export {}
